package ru.compft.web.beans.table;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.compft.common.data.Module;
import ru.compft.common.services.ModuleService;
import ru.compft.common.services.SystemService;
import ru.compft.web.WebConst;
import ru.compft.web.utils.FacesUtils;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.servlet.ServletRequest;
import java.io.Serializable;
import java.util.List;

/**
 * User: ASUS
 * Date: 02.08.12
 * Time: 21:37
 * Бин представляющий таблицу доступных модулей системы
 * Расширяет функционал постраничника
 */
@ManagedBean(name = WebConst.MODULES_TABLE)
@RequestScoped
public class ModulesTableBean extends PaginationBean implements Serializable {
    private static final long serialVersionUID = 7447475641972021277L;

    private static final Logger logger = LoggerFactory.getLogger(ModulesTableBean.class);

    public ModulesTableBean() {
        // Получаем количество записей на странице при создании бина
        final SystemService systemService = (SystemService) FacesUtils.getSpringBean(WebConst.SYSTEM_SERVICE);
        setRecordsPerPage(systemService.maxRecordsPerPage());
    }

    /**
     * Список модулей для вывода на текущей странице
     *
     * @return
     */
    @Override
    public List getRecords() {
        // Получаем номер страницы через Request, из его Query параметра
        final ServletRequest servletRequest = (ServletRequest) FacesUtils.getExternalContext().getRequest();
        final String pageParam = servletRequest.getParameter(PAGE_PARAM);

        if (logger.isDebugEnabled()) {
            logger.debug("Try get module list for page = " + pageParam);
        }

        // Если параметра нет, то возвращаем 1-ю страницу.
        int currentPage = currentPageValidNumber(pageParam);

        if (logger.isDebugEnabled()) {
            logger.debug("Set current page = " + currentPage);
        }

        // устанавливаем номер страницы в бин
        setCurrentPage(currentPage);

        // получаем количество записей на странице
        final int recordsPerPage = getRecordsPerPage();

        // считаем начальный индекс - номер страницы умноженный на максимальное количество записей на странице
        // минус 1 делаем потому. что это индекс начала страницы
        final int fromIndex = (currentPage - 1) * recordsPerPage;
        return getModules(fromIndex, recordsPerPage);
    }


    /**
     * Список заданного количества записей от определенного индекса
     *
     * @param from  - индекс начала
     * @param count - количества записей
     * @return
     */
    private List<Module> getModules(int from, int count) {
        if (logger.isDebugEnabled()) {
            logger.debug("Try getting '" + count + "' modules from '" + from + "' index");
        }

        // получаем сервис работы с модулями
        final ModuleService moduleService = (ModuleService) FacesUtils.getSpringBean(WebConst.MODULE_SERVICE);
        final List<Module> moduleList = moduleService.getModules(from, count);
        final int totalRecords = moduleService.countAllModules();

        // анализируем общее количество страниц, чтоб их было больше чем запрошенная
        analizeTotalPage(totalRecords);

        // заполняем некоторые поля для постраничника
        fillPagebleParams(from, count, moduleList, totalRecords);

        if (logger.isDebugEnabled()) {
            logger.debug("Was fount '" + (moduleList != null ? moduleList.size() : "null") + "' modules");
        }

        return moduleList;
    }

//    @Override
//    public String getTableName() {
//        return VIEW_TABLE_NAME;
//    }
//
//    @Override
//    public List<String> getColumns() {
//        return Arrays.asList(VIEW_TABLE_COLUMN);
//    }
//
//    @Override
//    public List<List<String>> getRecords() {
//        renderTable();
//
//        if (!CollectionUtils.isEmpty(moduleList)) {
//            final List<List<String>> resultList = new LinkedList<List<String>>();
//            for (Module module : moduleList) {
//                final List<String> subList = new LinkedList<String>();
////                "code", "name", "visible", "pages", "description", "order"
//                subList.add(Long.toString(module.getId()));
//                subList.add(module.getCode());
//                subList.add(module.getName());
//                subList.add(Boolean.toString(module.isVisible()));
//                subList.add(module.getPagesForView());
//                subList.add(module.getDescription());
//                subList.add(Integer.toString(module.getOrder()));
//
//                resultList.add(subList);
//            }
//            return resultList;
//        }
//        return Collections.EMPTY_LIST;
//    }

}
